package com.winfield.photovideo;

import java.io.File;
import java.io.FileOutputStream;





import android.app.Activity;
import android.content.Intent;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.view.SurfaceHolder.Callback;
import android.widget.Toast;

public class TakePhotoActivity extends Activity {
	private View layout;//布局
	private  Camera camera;
	private String userID;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //在显示界面之前  要修改显示器  这样可以才可以实现全屏
        requestWindowFeature(Window.FEATURE_NO_TITLE);//无标题
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
        		WindowManager.LayoutParams.FLAG_FULLSCREEN);//设置全屏显示的标志
        setContentView(R.layout.takephotoactivity);
        
        layout = this.findViewById(R.id.takephotolayout);
        
        //intent是用于激活它的对象
		Intent intent = getIntent();
        //获取userID
        Bundle bundle = intent.getExtras();
		userID = bundle.getString("userID");
        
        //在surfaceView创建出来  才能将镜头捕获到的画面给他
        SurfaceView surfaceView = (SurfaceView)this.findViewById(R.id.surfaceView);
        
        //得到surfaceView的显示控件对象  设置他的类型为  将镜头得到的东西直接给surfaceView  不用维护他们之间的缓冲区了
        surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        surfaceView.getHolder().setFixedSize(176, 144);//分辨率
        surfaceView.getHolder().setKeepScreenOn(true);//设置摄像头时不锁屏  保持高亮
        surfaceView.getHolder().addCallback(new SurfaceCallBack());//为surface设置监听对象 监控什么时候把surfaceview创建出来
        
    }
    //拍照按钮的响应事件
    public void takepicture(View v){
    	//首先要判断摄像机是否为空
    	if(camera!=null){
    		//判断是哪个按钮
    		switch(v.getId()){
    		case R.id.takepicture:
    			//shutter快门按下事件
    			//raw 没经过压缩的数据
    			//jpeg 经过压缩后的2数据
    			camera.takePicture(null, null, new MyPictureCallback());
    			break;
    		case R.id.autofocus:
    			//点击的是对焦按钮  可以对对焦后的事件做相应的处理  此处不做处理
    			camera.autoFocus(null);
    		default:
    			break;
    		}
    	}
    }

    /**
     * 内部类  
     * 调用cramera的方法后  拍完照之后的 照片经过压缩后  就会传给给对象中的onPictureTaken方法
     * @author WInfield
     *
     */
    private final class MyPictureCallback implements PictureCallback{
    	//data   就是jpg文件
		//camera  当前的对象
		@Override
		public void onPictureTaken(byte[] data, Camera camera) {
			try{
			//TODO
			//File  构造的两个参数  第一个是  存放的路径名  第二个是文件名称
			String fileName = System.currentTimeMillis()+".jpg";
			
			String filePath =Environment.getExternalStorageDirectory().getAbsolutePath();
			File jpgFile = new File(filePath,fileName);
			//将得到的数据写到文件中
			FileOutputStream outputStream = new FileOutputStream(jpgFile);
			outputStream.write(data);
			outputStream.close();
			
			
			//这个地方已经处理完照片了  可以继续进行预览了
			//TODO
			Toast.makeText(getApplicationContext(), R.string.takephotosuccess, 1).show();
			
			camera.startPreview();
			openUploadActivity(filePath,fileName);
			
			
			}catch(Exception e){
				e.printStackTrace();
			}
		}
    	
    }
   
    /**
     * 内部类  用于对surfaceview相应事件作出处理
     * @author Administrator
     *
     */
    private final class SurfaceCallBack implements Callback{

		@Override
		public void surfaceCreated(SurfaceHolder holder) {
			//创建surface时  调用了这个api
			try{

			camera = Camera.open();//打开摄像头
			Camera.Parameters parameters = camera.getParameters();//得到摄像头的各个参数对象
			Log.i("wCamere", parameters.flatten());
			//摄像头中捕获到的画面的大小
			parameters.setPreviewSize(800, 480);
			//每秒中捕获的频率
			parameters.setPreviewFrameRate(10);
			//设置输出的照片的格式
			//parameters.setPreviewFormat(ImageFormat.JPEG);  //设置之后  就用不了了
			//设置的照片的大小
			parameters.setPictureSize(320, 240);
			//设置拍摄的jpg格式照片的大小 一般是100 80也可以
			parameters.setJpegQuality(80);
			//将摄像头捕获的画面给surfaceView
			camera.setParameters(parameters);
			camera.setPreviewDisplay(holder);
			//使摄像头开始预览
			camera.startPreview();
			}catch(Exception e){
				e.printStackTrace();
			}
			
		}

		@Override
		public void surfaceChanged(SurfaceHolder holder, int format, int width,
				int height) {	
		}

		@Override
		public void surfaceDestroyed(SurfaceHolder holder) {
			if(camera!=null){
				camera.release();
				camera = null;
			}
		}
    	
    }

    
    @Override
	public boolean onTouchEvent(MotionEvent event) {

    	//取到这个事件  如果这个事件是手指按下去  那么就把相对布局给显示出来  原来的布局是不显示出来的
    	if(event.getAction() == MotionEvent.ACTION_DOWN){
    		//将那个装了两个按钮的视图给显示出来ViewGroup.VISIBLE
    		//视图不显示是 ViewGroup.GONE
    		layout.setVisibility(ViewGroup.VISIBLE);
    		//不再往后传递  要消费掉该事件   return ture
    		return true;
    		
    	}
		return super.onTouchEvent(event);
	}



	@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    
	/**
	 * 改方法用于打开上传界面
	 * @param filePath  拍摄资源所在路径
	 * @param fileName  拍摄资源的名称
	 */
	public void openUploadActivity(String filePath,String fileName){
		//构建意图对象
    	Intent intent = new Intent();
    	//设置要激活的组件  上下文+要激活的组件的名称  方法1
    	intent.setClass(this, UploadActivity.class);
    	//利用bundle对象  进行参数设置
    	Bundle bundle = new Bundle();
    	bundle.putString("userID", userID);
    	bundle.putString("filePath", filePath);
    	bundle.putString("fileName", fileName);
    	intent.putExtras(bundle);
    	
    	//启动意图  将自动激活里面的参数
    	startActivity(intent);
    	
	}
}